#include <stdio.h>
#include <stdlib.h>
#include "linkQueue.h"

LinkQueue *createLinkQueue() {
    LinkQueue *queue = (LinkQueue *)malloc(sizeof(LinkQueue));
    queue->rear = queue->front = NULL;
    queue->cnt = 0;
    return queue;
}

void releaseLinkQueue(LinkQueue *queue) {
    if (queue) {
        // 从队头开始，组个释放每个节点
        QueNode *node;
        while (queue->front) {
            node = queue->front;
            queue->front = node->next;
            free(node);
            --queue->cnt;
        }
        printf("queue have %d node!\n", queue->cnt);
        free(queue);
    }
}

// 从队尾开始入，此时的队尾就是前置节点
int enLinkQueue(LinkQueue *queue, Element e) {
    // 1. 申请空间
    QueNode *node = (QueNode *) malloc(sizeof(QueNode));
    if (node == NULL) {
        printf("queue full!\n");
        return -1;
    }
    // 2. 处理新节点
    node->data = e;
    node->next = NULL;
    // 3. 处理老节点
    if (queue->rear) {		// 尾指针存在，直接操作
        queue->rear->next = node;
        queue->rear = node;		// 4. 更新队尾指针
    } else {
        queue->rear = queue->front = node;	// 4. 更新队尾指针
    }
    ++queue->cnt;
    return 0;
}

int deLinkQueue(LinkQueue *queue, Element *e) {
    if (queue == NULL || queue->front == NULL) {
        printf("queue empty!\n");
        return -1;
    }
    *e = queue->front->data;
    // 1. 备份
    QueNode *tmp = queue->front;
    queue->front = tmp->next;
    free(tmp);
    --queue->cnt;
    // 2. 链式存储，考虑没有元素时，不要把野指针继续保留在队列头中，是否队列以空
    if (queue->front == NULL) {
        queue->rear = NULL;
    }
    return 0;
}